package fr.umlv.m2.uwp2011.persistence.matiere.dao;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import fr.umlv.m2.uwp2011.persistence.matiere.Cursus;
import fr.umlv.m2.uwp2011.persistence.matiere.IMatiereDAO;
import fr.umlv.m2.uwp2011.persistence.matiere.Matiere;
import fr.umlv.m2.uwp2011.persistence.matiere.TroncCommun;


public class HibernateMatiereDAO implements IMatiereDAO {
	private static final Map<Long, Matiere> allMatiere = new HashMap<Long, Matiere>();
	private static final HashMap<String, List<Matiere>> mapUserMatieres = new HashMap<String, List<Matiere>>();

	private static final HibernateTroncCommunDAO troncCommunDAO = new HibernateTroncCommunDAO();
	private static final HibernateCursusDAO cursusDAO = new HibernateCursusDAO();

	static {
		Matiere matiere;
		Long matiere_id;
		List<TroncCommun> list;
		//--------------- matiere with id 1 -----------//
		matiere_id = 1L;
		matiere = new Matiere();
		matiere.setId(matiere_id);
		matiere.setLibelle("prog reseau");
		matiere.setDescriptif("la prog reseau");
		list = new ArrayList<TroncCommun>();
		list.add(troncCommunDAO.findById(1L));
		list.add(troncCommunDAO.findById(2L));
		allMatiere.put(matiere_id, matiere);
		
		//--------------- matiere with id 2 -----------//
		matiere_id = 2L;
		matiere = new Matiere();
		matiere.setId(matiere_id);
		matiere.setLibelle("prog c");
		matiere.setDescriptif("la prog c");
		list = new ArrayList<TroncCommun>();
		list.add(troncCommunDAO.findById(1L));
		allMatiere.put(matiere_id, matiere);
		
		//--------------- matiere with id 3 -----------//
		matiere_id = 3L;
		matiere = new Matiere();
		matiere.setId(matiere_id);
		matiere.setLibelle("reseaux sans fil");
		matiere.setDescriptif("les reseaux sans fil");
		list = new ArrayList<TroncCommun>();
		list.add(troncCommunDAO.findById(2L));
		allMatiere.put(matiere_id, matiere);
		
		//--------------- matiere with id 4 -----------//
		matiere_id = 4L;
		matiere = new Matiere();
		matiere.setId(matiere_id);
		matiere.setLibelle("applications web");
		matiere.setDescriptif("les applications web");
		list = new ArrayList<TroncCommun>();
		list.add(troncCommunDAO.findById(3L));
		allMatiere.put(matiere_id, matiere);
		
		//--------------- matiere with id 5 -----------//
		matiere_id = 5L;
		matiere = new Matiere();
		matiere.setId(matiere_id);
		matiere.setLibelle("ressources linguistique");
		matiere.setDescriptif("les ressources linguistique");
		list = new ArrayList<TroncCommun>();
		list.add(troncCommunDAO.findById(4L));
		allMatiere.put(matiere_id, matiere);
		
		//--------------- matiere with id 6 -----------//
		matiere_id = 6L;
		matiere = new Matiere();
		matiere.setId(matiere_id);
		matiere.setLibelle("ITI");
		matiere.setDescriptif("initiation au traitement de l image");
		list = new ArrayList<TroncCommun>();
		list.add(troncCommunDAO.findById(5L));
		allMatiere.put(matiere_id, matiere);

		//--------------- matiere with id 7 -----------//
		matiere_id = 7L;
		matiere = new Matiere();
		matiere.setId(matiere_id);
		matiere.setLibelle("suites");
		matiere.setDescriptif("les suites");
		list = new ArrayList<TroncCommun>();
		list.add(troncCommunDAO.findById(6L));
		list.add(troncCommunDAO.findById(7L));
		allMatiere.put(matiere_id, matiere);
		
		initMapUserMatieres();
	}
	
	private static void initMapUserMatieres() {
		List<Matiere> list;
		//----- list matiere of student "etud1"----- //
		list = new ArrayList<Matiere>();
		list.add(allMatiere.get(1L));
		list.add(allMatiere.get(2L));
		mapUserMatieres.put("etud1", list);
		
		//----- list matiere of student "etud2"----- //
		list = new ArrayList<Matiere>();
		list.add(allMatiere.get(1L));
		list.add(allMatiere.get(3L));
		list.add(allMatiere.get(4L));
		mapUserMatieres.put("etud2", list);
		
		//----- list matiere of student "etud3"----- //
		list = new ArrayList<Matiere>();
		list.add(allMatiere.get(5L));
		mapUserMatieres.put("etud3", list);
		
		//----- list matiere of student "etud4"----- //
		list = new ArrayList<Matiere>();
		list.add(allMatiere.get(5L));
		list.add(allMatiere.get(7L));
		mapUserMatieres.put("etud4", list);
		
		//----- list matiere of student "etud5"----- //
		list = new ArrayList<Matiere>();
		list.add(allMatiere.get(6L));
		mapUserMatieres.put("etud5", list);
		
		//----- list matiere of student "etud6"----- //
		list = new ArrayList<Matiere>();
		list.add(allMatiere.get(6L));
		list.add(allMatiere.get(7L));
		mapUserMatieres.put("etud6", list);
		
		//----- list matiere of student "etud7"----- //
		list = new ArrayList<Matiere>();
		list.add(allMatiere.get(7L));
		mapUserMatieres.put("etud7", list);
		
		//----- list matiere of student "prof1"----- //
		list = new ArrayList<Matiere>();
		list.add(allMatiere.get(1L));
		list.add(allMatiere.get(2L));
		list.add(allMatiere.get(3L));
		list.add(allMatiere.get(5L));
		list.add(allMatiere.get(7L));
		mapUserMatieres.put("prof1", list);
		
		//----- list matiere of student "prof2"----- //
		list = new ArrayList<Matiere>();
		list.add(allMatiere.get(4L));
		mapUserMatieres.put("prof2", list);
		
		//----- list matiere of teacher "prof3"----- //
		list = new ArrayList<Matiere>();
		list.add(allMatiere.get(6L));
		list.add(allMatiere.get(7L));
		mapUserMatieres.put("prof3", list);
		
		//----- list matiere of student "prof4"----- //
		list = new ArrayList<Matiere>();
		list.add(allMatiere.get(7L));
		mapUserMatieres.put("prof4", list);
	}
	
	@Override
	public List<Matiere> findByUserID(String user_id) {
		return mapUserMatieres.get(user_id);
	}

	@Override
	public List<Matiere> findByUserAndCursus(String user_id, Long cursus_id) {
		//-------- get matieres of cursus -----------//
		Cursus cursus = cursusDAO.findById(cursus_id);
		Set<Matiere> matieres = new HashSet<Matiere>();
		Iterator<TroncCommun> iteratorTronc = cursus.iteratorTroncCommun();
		while(iteratorTronc.hasNext()) {
			Iterator<Matiere> iteratorMatiere = iteratorTronc.next().iteratorMatiere();
			while(iteratorMatiere.hasNext()) {
				matieres.add(iteratorMatiere.next());
			}
		}
		List<Matiere> matieresByUser = findByUserID(user_id);
		matieres.retainAll(matieresByUser);
		return new ArrayList<Matiere>(matieres);
	}

	@Override
	public Matiere findById(long id) {
		return allMatiere.get(id);
	}
}
